package edu.pucsp.predatorprey;

import java.util.HashSet;
import java.util.Set;

import edu.pucsp.predatorprey.simulador.api.Simulador;
import edu.pucsp.predatorprey.simulador.erlang.SimuladorErlang;
import edu.pucsp.predatorprey.simulador.java.SimuladorJava;
import edu.pucsp.predatorprey.simulador.java.criatura.AbstractCriatura;
import edu.pucsp.predatorprey.simulador.java.criatura.Predador;
import edu.pucsp.predatorprey.simulador.java.criatura.Presa;
import edu.pucsp.predatorprey.simulador.java.terreno.api.Terreno;
import edu.pucsp.predatorprey.simulador.java.terreno.impl.TerrenoImpl;
import edu.pucsp.predatorprey.tela.Controle;
import edu.pucsp.predatorprey.tela.TipoSimulador;

public class FabricaSimulacao {

	private FabricaSimulacao() {
	}

	public static Simulador fabricar(TipoSimulador tipo, Controle controle, int qtdPresas, int qtdPredador) {
		Simulador simulador;
		if (tipo.equals(TipoSimulador.THREADS)) {
			Set<AbstractCriatura> criaturas = gerarCriaturas(qtdPresas, qtdPredador);
			Terreno terreno = new TerrenoImpl(criaturas);
			SimuladorJava simuladorJava = new SimuladorJava(terreno);
			terreno.adicionarObservador(simuladorJava);
			simulador = simuladorJava;
		} else {
			SimuladorErlang simuladorErlang = new SimuladorErlang(qtdPresas, qtdPredador);
			simulador = simuladorErlang;
		}
		simulador.definirSaida(controle);
		return simulador;
	}

	private static Set<AbstractCriatura> gerarCriaturas(int qtdPresas, int qtdPredador) {
		Set<AbstractCriatura> criaturas = new HashSet<AbstractCriatura>();

		for (int i = 0; i < qtdPredador; i++) {
			criaturas.add(new Predador());
		}
		for (int i = 0; i < qtdPresas; i++) {
			criaturas.add(new Presa());
		}

		return criaturas;
	}

}
